package com.ungs.form;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

import com.ungs.bo.ProcesoBO;
import com.ungs.bo.impl.ProcesoBOImpl;
import com.ungs.entities.Proceso;
import com.ungs.utils.Constantes;

public class BajaLogicaProceso extends JDialog {
	private static final long serialVersionUID = 1L;
	private final JPanel contentPanel = new JPanel();
	private JTextField txtProceso;
	private JTable tbProcesos;
	private JScrollPane scrollPaneProcesos;
	private ProcesoBO procesoBO;
	private List<Proceso> procesoList;
	private List<Integer> ordenList;
	private static int COL_ESTADO = 0;
	private static int COL_CODIGO = 1;
	private static int COL_ORDEN = 2;
	private static int COL_DESCRIPCION = 3;

	public BajaLogicaProceso(JFrame parent) {
		super(parent, true);
		setResizable(false);
		setTitle("Eliminar Proceso");
		this.setLocationRelativeTo(parent);
		initForm();
		formatoTablaProceso();
		ordenList = new ArrayList<Integer>();
		procesoBO = new ProcesoBOImpl();
		procesoList = procesoBO.getProcesosOrdenados(true);
		cargarTablaProceso();
		iniciarProcesoForm();
	}

	@SuppressWarnings("serial")
	private void initForm() {
		setTitle("Eliminar Proceso");
		setBounds(100, 100, 365, 494);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(null);

		JPanel panel = new JPanel();
		panel.setLayout(null);
		panel.setBorder(new TitledBorder(

		new LineBorder(new Color(0, 0, 0)), " B\u00FAsqueda ",

		TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0,

		0, 0)));
		panel.setBounds(10, 11, 338, 115);
		contentPanel.add(panel);

		JLabel lblCodigo = new JLabel("Codigo Proceso:");
		lblCodigo.setBounds(10, 22, 167, 14);
		panel.add(lblCodigo);

		txtProceso = new JTextField();
		txtProceso.setColumns(10);
		txtProceso.setBounds(10, 47, 167, 20);
		panel.add(txtProceso);

		JButton btnBuscar = new JButton("Buscar");
		btnBuscar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				eventoBotonBuscar();
			}
		});
		btnBuscar.setBounds(10, 82, 91, 23);
		panel.add(btnBuscar);

		JButton btnTodos = new JButton("Todos");
		btnTodos.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				eventoBotonTodos();
			}
		});
		btnTodos.setBounds(123, 82, 91, 23);
		panel.add(btnTodos);

		JPanel panelProcesos = new JPanel();
		panelProcesos.setLayout(null);
		panelProcesos.setBorder(new TitledBorder(new LineBorder(new Color(0, 0,
				0)), "Procesos", TitledBorder.LEADING, TitledBorder.TOP, null,
				null));
		panelProcesos.setBounds(10, 137, 338, 275);
		contentPanel.add(panelProcesos);

		scrollPaneProcesos = new JScrollPane();
		scrollPaneProcesos.setBounds(10, 22, 318, 242);

		panelProcesos.add(scrollPaneProcesos);

		tbProcesos = new JTable();
		tbProcesos.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				eventoTabla();
			}
		});
		tbProcesos.setModel(new DefaultTableModel(new Object[][] {},
				new String[] { "Estado", "Codigo", "Orden", "Descripcion" }) {
			@SuppressWarnings("rawtypes")
			Class[] columnTypes = new Class[] { Boolean.class, String.class,
					Integer.class, String.class };

			@SuppressWarnings({ "unchecked", "rawtypes" })
			public Class getColumnClass(int columnIndex) {
				return columnTypes[columnIndex];
			}

			boolean[] columnEditables = new boolean[] { true, false, false,
					false };

			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		tbProcesos.getColumnModel().getColumn(0).setResizable(false);
		tbProcesos.getColumnModel().getColumn(1).setResizable(false);
		tbProcesos.getColumnModel().getColumn(2).setResizable(false);
		tbProcesos.getColumnModel().getColumn(3).setResizable(false);
		scrollPaneProcesos.setViewportView(tbProcesos);
		{
			JPanel buttonPane = new JPanel();
			buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
			{
				JButton okButton = new JButton("Guardar");
				okButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						eventoBotonAceptar();
					}
				});
				okButton.setActionCommand("OK");
				buttonPane.add(okButton);
				getRootPane().setDefaultButton(okButton);
			}
			{
				JButton cancelButton = new JButton("Cancelar");
				cancelButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						eventoBotonCancelar();
					}
				});
				cancelButton.setActionCommand("Cancel");
				buttonPane.add(cancelButton);
			}
		}
	}

	private void iniciarProcesoForm() {
		ordenList = new ArrayList<Integer>();
		for (Proceso proceso : procesoList) {
			if (proceso.getOrden() != 0) {
				ordenList.add(proceso.getOrden());
			}
		}

		int ultimoOrden = ordenList.get(ordenList.size() - 1);
		ordenList.add(ultimoOrden + 1);
	}

	private void cargarTablaProceso() {
		// Se borra la tabla
		DefaultTableModel modeloTabla = (DefaultTableModel) tbProcesos
				.getModel();
		int filas = modeloTabla.getRowCount() - 1;
		if (filas >= 0) {
			for (int i = filas; i >= 0; i--) {
				modeloTabla.removeRow(i);
			}
		}

		// Se llena la tabla
		int fila = 0;
		for (Proceso proceso : procesoList) {
			DefaultTableModel modelo = (DefaultTableModel) tbProcesos
					.getModel();
			modelo.addRow(new Object[1]);

			if (proceso.getEstadoLogico().equals("A")) {
				tbProcesos.setValueAt(Boolean.TRUE, fila, COL_ESTADO);
			} else {
				tbProcesos.setValueAt(Boolean.FALSE, fila, COL_ESTADO);
			}
			tbProcesos.setValueAt(proceso.getCodigo(), fila, COL_CODIGO);
			tbProcesos.setValueAt(proceso.getOrden(), fila, COL_ORDEN);
			tbProcesos.setValueAt(proceso.getDescripcion(), fila,
					COL_DESCRIPCION);

			fila++;
		}
	}

	private void eventoBotonAceptar() {
		int fila = 0;
		for (Proceso proceso : procesoList) {
			boolean estadoCalidad = false;

			if (proceso.getEstadoLogico().equals(Constantes.ALTA)) {
				estadoCalidad = true;
			}

			if ((Boolean) tbProcesos.getValueAt(fila, COL_ESTADO) != estadoCalidad) {
				if ((Boolean) tbProcesos.getValueAt(fila, COL_ESTADO)) {
					proceso.setEstadoLogico(Constantes.ALTA);
					// Preguntar por el orden
				} else {
					proceso.setEstadoLogico(Constantes.BAJA);
					proceso.setOrden(0);
					// Se corren los procesos
				}

				procesoBO.actualizar(proceso);

			}
			fila++;
		}

		int ordenNuevo = 1;
		for (Proceso proceso : procesoList) {
			if (proceso.getEstadoLogico().equals(Constantes.ALTA)) {
				proceso.setOrden(ordenNuevo);
				procesoBO.actualizar(proceso);
				ordenNuevo++;
			}
		}

		cargarTablaProceso();

		JOptionPane.showMessageDialog(this, "Se han guardado los cambios",
				"Actualizado", JOptionPane.INFORMATION_MESSAGE);
		this.setVisible(false);
		this.dispose();
	}

	private void eventoBotonCancelar() {
		this.setVisible(false);
		this.dispose();
	}

	private void eventoBotonBuscar() {
		String param = txtProceso.getText();
		// true trae todos.
		procesoList = procesoBO.getProcesoByFilter(param, true);
		cargarTablaProceso();
	}

	@SuppressWarnings("unchecked")
	private void eventoBotonTodos() {
		procesoList = procesoBO.getAll(Proceso.class);
		cargarTablaProceso();
	}

	private void formatoTablaProceso() {
		DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
		tcr.setHorizontalAlignment(SwingConstants.CENTER);
		tbProcesos.getColumnModel().getColumn(COL_ORDEN).setCellRenderer(tcr);

		int ancho = scrollPaneProcesos.getWidth();
		int anchoColumna = 0;
		TableColumnModel modeloColumna = tbProcesos.getColumnModel();
		TableColumn columnaTabla;

		for (int i = 0; i < tbProcesos.getColumnCount(); i++) {
			columnaTabla = modeloColumna.getColumn(i);
			switch (i) {
			case 0:
				anchoColumna = (18 * ancho) / 100;
				break;
			case 1:
				anchoColumna = (18 * ancho) / 100;
				break;
			case 2:
				anchoColumna = (16 * ancho) / 100;
				break;
			case 3:
				anchoColumna = (48 * ancho) / 100;
				break;
			}
			columnaTabla.setPreferredWidth(anchoColumna);
		}
	}

	private List<Proceso> reordenarProcesos(Proceso procesoParam) {
		List<Proceso> procesoNew = new ArrayList<Proceso>();
		int ultimoOrden = ordenList.get(ordenList.size() - 1);
		List<Proceso> procesoAltaList = new ArrayList<Proceso>();

		for (Proceso proceso : procesoList) {
			if (proceso.getEstadoLogico().equals(Constantes.ALTA)) {
				procesoAltaList.add(proceso);
			}
		}

		procesoParam.setEstadoLogico(Constantes.ALTA);

		if (procesoParam.getOrden() == ultimoOrden) {
			procesoAltaList.add(procesoParam);
			procesoBO.actualizar(procesoParam);
			procesoNew = procesoAltaList;

		} else {

			for (Proceso proceso : procesoAltaList) {
				if (procesoParam.getOrden() < proceso.getOrden()) {
					proceso.setOrden(proceso.getOrden() + 1);
					procesoBO.actualizar(proceso);
				}
				if (procesoParam.getOrden() == proceso.getOrden()) {
					proceso.setOrden(proceso.getOrden() + 1);
					procesoNew.add(procesoParam);
					procesoBO.actualizar(procesoParam);
					procesoBO.actualizar(proceso);
				}

				if (procesoParam.getOrden() == ultimoOrden) {
					procesoNew.add(procesoParam);
					procesoBO.actualizar(procesoParam);
				}

				procesoNew.add(proceso);

			}
		}

		return procesoNew;
	}

	private void eventoTabla() {
		int filaSeleccionada = tbProcesos.getSelectedRow();
		if (filaSeleccionada >= 0) {
			Proceso proceso = procesoList.get(filaSeleccionada);
			Boolean estado = (Boolean) tbProcesos.getValueAt(filaSeleccionada,
					COL_ESTADO);
			if (proceso.getEstadoLogico().equals(Constantes.BAJA) && estado) {
				// Si esta de baja y seleccionado para dar de alta
				// Abrir popup
				SeleccionarOrdenProcesoForm seleccionarOrdenProcesoForm = new SeleccionarOrdenProcesoForm(
						this, ordenList, proceso);
				seleccionarOrdenProcesoForm.setVisible(true);

				proceso = seleccionarOrdenProcesoForm.getProceso();
				if (proceso != null) {
					procesoList = reordenarProcesos(seleccionarOrdenProcesoForm
							.getProceso());
					procesoList = procesoBO.getProcesosOrdenados(true);
					cargarTablaProceso();
					iniciarProcesoForm();
					seleccionarOrdenProcesoForm.dispose();
				} else {
					procesoList = procesoBO.getProcesosOrdenados(true);
					cargarTablaProceso();
					iniciarProcesoForm();
				}

			}

		}
	}
}
